package com.manager.devicemanager.util;

import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import com.alibaba.fastjson2.JSONObject;

public class ActiveMQMessageSender {

    // ActiveMQ连接信息（从application-prod.yml获取）
    private static final String BROKER_URL = "tcp://8.148.212.106:61616";
    private static final String USERNAME = "admin";
    private static final String PASSWORD = "activemq@123";

    // 发送消息到指定主题（与Listener监听的destination对应）
    public static void sendAlarmMessage(String topic, String deviceName, String message, String time) throws JMSException {
        // 创建连接工厂
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);

        // 创建连接并启动
        try (Connection connection = connectionFactory.createConnection()) {
            connection.start();

            // 创建会话（非事务，自动确认）
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            // 创建主题（需与Listener的@JmsListener(destination)一致）
            Topic destination = session.createTopic(topic);

            // 创建生产者
            MessageProducer producer = session.createProducer(destination);

            // 构建消息体（匹配Listener中handleAlarmMessage的JSON格式）
            JSONObject messageJson = new JSONObject();
            messageJson.put("Message", message);  // 告警内容
            messageJson.put("Time", time);        // 告警时间
            messageJson.put("DeviceName", deviceName);  // 设备名称（可选，Listener中通过topic关联设备）

            // 创建文本消息并发送
            TextMessage textMessage = session.createTextMessage(messageJson.toString());
            producer.send(textMessage);

            System.out.println("ActiveMQ消息发送成功：" + messageJson);
        }
    }

    // 测试发送示例
    public static void main(String[] args) {
        try {
            // 目标主题（对应Listener中的@JmsListener(destination = "${mqtt.publish.topic1}/alarm")）
            // 假设publishICTopic配置值为"ic/topic1"，则完整destination为"ic/topic1/alarm"
            String targetTopic = "ic2/alarm";

            // 发送模拟告警消息
            sendAlarmMessage(
                targetTopic,
                "测试设备",  // 设备名称（Listener会通过topic查询DeviceInfo获取实际名称）
                "设备温度过高",  // 告警内容
                "2024-05-20 15:30:00"  // 告警时间
            );
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
